package hsb.learn;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Base64;

public class Base64ImageExample {

    /**
     * 将 Base64 编码的字符串解码为图片字节数组。
     * 这个方法可以处理带有 "data:image/..." 前缀的 Base64 字符串。
     * @param base64Code Base64 编码的图片字符串
     * @return 图片的字节数组
     */
    public static byte[] base64Img2ByteArray(String base64Code) {
        // 如果 base64Code 为 null 或为空，则直接返回 null
        if (base64Code == null || base64Code.isEmpty()) {
            return null;
        }

        // 处理 Data URI scheme (例如 "...")
        // 找到第一个逗号，截取之后的内容
        if (base64Code.startsWith("data:")) {
            int index = base64Code.indexOf(',');
            if (index != -1) {
                base64Code = base64Code.substring(index + 1);
            }
        }
        
        // 使用 Java 8 的 Base64 解码器
        return Base64.getDecoder().decode(base64Code);
    }

    /**
     * 将图片的字节数组转换为 BufferedImage 对象。
     * (我对你原来的代码做了一个小优化，避免创建两个无用的输入流)
     * @param imageByte 图片的字节数组
     * @return BufferedImage 对象
     * @throws IOException 如果字节数据无法被识别为图片
     */
    public static BufferedImage saveByteArrayImage(byte[] imageByte) throws IOException {
        if (imageByte == null || imageByte.length == 0) {
            return null;
        }
        // 创建一个字节数组输入流
        ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
        // ImageIO 从流中读取图片
        BufferedImage image = ImageIO.read(bis);
        // 关闭流
        bis.close();
        return image;
    }

    public static void main(String[] args) {
        // --- 准备 base64Img2ByteArray 方法的入参 ---
        // 这是一个硬编码的、代表 1x1 像素红色PNG图片的 Base64 字符串。
        // 它包含了 "data URI" 前缀，正好可以用来测试你的 base64Img2ByteArray 方法的完整逻辑。
        final String base64ImageString = "";

        System.out.println("准备调用方法，输入的Base64字符串是: " + base64ImageString);
        System.out.println("--------------------------------------------------");

        try {
            // --- 第一步：调用 base64Img2ByteArray ---
            System.out.println("1. 调用 base64Img2ByteArray 将 Base64 字符串转为 byte[]...");
            byte[] imageBytes = base64Img2ByteArray(base64ImageString);

            if (imageBytes != null) {
                System.out.println("   成功！转换后的字节数组长度为: " + imageBytes.length);
            } else {
                System.out.println("   失败！返回的字节数组为 null。");
                return; // 无法继续，退出程序
            }

            System.out.println("\n--------------------------------------------------");

            // --- 第二步：调用 saveByteArrayImage ---
            System.out.println("2. 调用 saveByteArrayImage 将 byte[] 转为 BufferedImage...");
            BufferedImage resultImage = saveByteArrayImage(imageBytes);

            // --- 验证结果 ---
            if (resultImage != null) {
                System.out.println("   成功！返回的 BufferedImage 对象不为空。");
                System.out.println("   验证图片尺寸:");
                System.out.println("   图片宽度: " + resultImage.getWidth());   // 预期输出: 1
                System.out.println("   图片高度: " + resultImage.getHeight());  // 预期输出: 1
            } else {
                System.out.println("   失败！返回的 BufferedImage 对象为空。");
            }

        } catch (IOException e) {
            System.err.println("在处理图片过程中发生IO异常: " + e.getMessage());
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            System.err.println("输入的Base64字符串格式不正确: " + e.getMessage());
            e.printStackTrace();
        }
    }
}